<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>call和apply</title>
</head>
<body>
    
</body>
</html>
<script>
    /*

    */

    function fun(a,b,c){
        console.log("a="+a);
        this.sayName();
        console.log("b="+b);
        console.log("c="+c)
    }
    var obj = {
        name:"obj",
        sayName:function(){
            alert(this.name);
        }
    };
    var obj2 = {
            name:"obj2"
    };
    /*
        call() 和 apply()
            - 这两个方法都是函数对象的方法，需要通过函数对象来调用
            - 当函数调用call() 和apply() 都会调用执行函数
            - 在调用call 和apply()可以将一个对象指定为第一个参数
                此时这个对象将会成为函数执行的 this

            - call() 方法可以将实参在对象之后依次传递
            - apply() 方法需要将实参封装到一个数组中统一传递

            - this的情况
                1.以函数形式调用时，this永远是window
                2.以方法的形式调用时，谁调用this，this指向谁
                3.以构造函数的形式调用时，this是新创建的那个对象
                4.使用call()和apply() 调用时，this 是指定的那个对象
    */
    
    // fun.call(obj,2,3);

    fun.apply(obj,[4,6,8]);


    


    // fun.call(obj);
    // fun.apply(obj2);
    // obj.sayName.apply(obj);
</script>